#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <json-c/json.h>
#include <libnotify/notify.h>  // 系统通知库
#include "ipc.h"

// 工作区切换的中二通知文案（带点emoji更带感）
const char* workspace_notify[10] = {
    "⚠️ 警告：你切到了不存在的异次元！",  // 0
    "⚔️ 第一战场已激活！准备敲代码迎战！", // 1
    "🚀 第二阵地请求支援！BUG正在逼近！",  // 2
    "☕ 第三工区摸鱼模式启动！咖啡满上！",  // 3
    "🐛 第四象限发现BUG巢穴！快拿杀虫剂！", //4
    "☕ 第五维度的咖啡煮好了！吨吨吨～",    //5
    "🎵 第六基地BGM：《孤勇者》循环中！",   //6
    "✨ 第七空间代码渡劫成功！飞升啦！",    //7
    "🐱 第八次元警告：猫咪占领了鼠标！",    //8
    "✅ 第九重天编译通过！可以摸鱼了！"     //9
};

// 初始化libnotify
void init_notify() {
    if (!notify_init("i3中二播报器")) {
        fprintf(stderr, "初始化通知失败！你系统没装通知服务吗？\n");
        exit(1);
    }
}

// 发送通知气泡
void show_notification(const char* message) {
    NotifyNotification* n = notify_notification_new(
        "工作区切换通知",  // 标题
        message,           // 内容
        "dialog-information"  // 图标（系统默认）
    );
    // 设置通知超时时间（3秒）
    notify_notification_set_timeout(n, 3000);
    // 显示通知（忽略错误）
    notify_notification_show(n, NULL);
    // 释放资源
    g_object_unref(G_OBJECT(n));
}

// 连接i3的IPC socket（复用之前的函数）
int connect_to_i3() {
    const char* socket_path = getenv("I3SOCK");
    if (!socket_path) {
        fprintf(stderr, "找不到i3的socket！请在i3里运行～\n");
        return -1;
    }

    int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("创建socket失败");
        return -1;
    }

    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);

    if (connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        perror("连接i3失败");
        close(sockfd);
        return -1;
    }

    return sockfd;
}

// 订阅工作区事件
void subscribe_to_workspaces(int sockfd) {
    const char* payload = "[\"workspace\"]";
    i3_ipc_header_t header;

    strncpy(header.magic, I3_IPC_MAGIC, 6);
    header.size = strlen(payload);
    header.type = I3_IPC_MESSAGE_TYPE_SUBSCRIBE;

    write(sockfd, &header, sizeof(header));
    write(sockfd, payload, header.size);

    // 简单确认订阅成功
    char buf[1024];
    read(sockfd, &header, sizeof(header));
    read(sockfd, buf, header.size);
    printf("订阅成功！现在切换工作区试试～\n");
}

// 处理事件并发送通知
void handle_events(int sockfd) {
    i3_ipc_header_t header;
    char* payload;

    while (1) {
        if (read(sockfd, &header, sizeof(header)) != sizeof(header)) {
            perror("读取事件失败");
            break;
        }

        if (header.type != I3_IPC_EVENT_WORKSPACE)
            continue;

        payload = malloc(header.size + 1);
        read(sockfd, payload, header.size);
        payload[header.size] = '\0';

        // 解析工作区编号
        json_object* root = json_tokener_parse(payload);
        json_object* current;
        if (json_object_object_get_ex(root, "current", &current)) {
            json_object* num_obj;
            if (json_object_object_get_ex(current, "num", &num_obj)) {
                int ws_num = json_object_get_int(num_obj);
                // 发送对应通知
                if (ws_num >= 0 && ws_num < 10)
                    show_notification(workspace_notify[ws_num]);
                else
                    show_notification("🌌 工作区编号已突破天际！这是第几个平行宇宙？");
            }
        }

        json_object_put(root);
        free(payload);
    }
}

int main() {
    printf("===== i3中二工作区通知器 =====\n");
    init_notify();  // 初始化通知

    int sockfd = connect_to_i3();
    if (sockfd == -1) {
        notify_uninit();
        return 1;
    }

    subscribe_to_workspaces(sockfd);
    handle_events(sockfd);

    // 清理资源
    close(sockfd);
    notify_uninit();
    return 0;
}
